﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _006_虚方法_隐藏方法_this和base的区别_抽象类
{
    class Program
    {
        //this可以访问当前类中定义的字段、属性和方法，有没有this都可以访问，有this可以让IDE-VS编译器给出提示
        //另外当方法的参数和字段重名的时候，使用this可以表明访问的是类中的字段
        //base可以调用父类中的公有方法和字段,有没有bash都可以访问
        //但是加上base,IED工具会给出提示，把所有可以调用的字段和方法罗列出来方便选择

        static void Main(string[] args)
        {
            //如果虚方法在子类被重写了，那么将会执行重写后的方法
            Child child = new Child();
            child.Move();
            //父类不受重写的影响
            Father father = new Father();
            father.Move();
            //用父类去声明子类对象也会受影响
            Father cq = new Child();
            cq.Move();
            

            //实验：试试看在另一个子类能不能调用到被child覆写的方法,结果:不能

            
            Child_A a = new Child_A();
            a.Move();
            //隐藏方法：如果使用子类声明的对象，调用隐藏方法会调用子类的，如果使用父类声明对象，那么就会调用父类的隐藏方法
            Father a1 = new Child_A();
            a1.Move();

            Crow crow = new Crow();
            crow.Fly();
            //我们不能用抽象类去构造函数，但是可以利用抽象类去声明
            Bird bird = new Crow();
            bird.Fly();

            Console.ReadKey();
        }
    }
}
